package com.operator.Activitys.activity;

import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.lljjcoder.Interface.OnCityItemClickListener;
import com.lljjcoder.bean.CityBean;
import com.lljjcoder.bean.DistrictBean;
import com.lljjcoder.bean.ProvinceBean;
import com.lljjcoder.citywheel.CityConfig;
import com.lljjcoder.style.citypickerview.CityPickerView;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.utils.CheckUtils;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.ToastUtils;

import org.simple.eventbus.Subscriber;

import java.io.IOException;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * 项目名称：金泽云 手机app
 * 类描述：注册页面
 * 创建人：张飞祥
 * 创建时间：2018/5/2 15:08
 * 修改人：张飞祥
 * 修改时间：2018/5/2 15:08
 * 修改备注：
 */
public class RegisterActivity extends BaseActivity {


    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //店铺名称
    @Bind(R.id.et_register_shop_name)
    EditText etRegisterShopName;
    //手机号
    @Bind(R.id.et_register_phone)
    EditText etRegisterPhone;
    //输入验证码
    @Bind(R.id.et_register_check_code)
    EditText etRegisterCheckCode;
    //获取验证码
    @Bind(R.id.btn_register_code)
    TextView btnRegisterCode;
    //输入密码
    @Bind(R.id.et_register_pwd)
    EditText etRegisterPwd;
    //确认密码
    @Bind(R.id.et_register_confirm_pwd)
    EditText etRegisterConfirmPwd;
    //所属区域
    @Bind(R.id.tv_register_region)
    TextView tvRegisterRegion;
    //店铺地址
    @Bind(R.id.et_register_address)
    EditText etRegisterAddress;
    //店铺电话
    @Bind(R.id.et_register_shop_phone)
    EditText etRegisterShopPhone;
    //业务员姓名
    @Bind(R.id.et_register_work_name)
    EditText etRegisterWorkName;
    //业务员电话
    @Bind(R.id.et_register_work_phone)
    EditText etRegisterWorkPhone;

    //初始化网络请求
    public UserManager mApiManager;
    //省市区 三级联动 申明对象
    CityPickerView mPicker = new CityPickerView();
    //获取验证码等待时间
    protected int mTimeSecond = 60; // 总秒数

    @Override
    protected void initUI() {
        setContentView(R.layout.act_register);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this, this.getTaskId());
        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //设置标题
        tvTitle.setText("注册");
    }

    @Override
    protected void initData() {
        /**
         * 预先加载仿iOS滚轮实现的全部数据
         */
        mPicker.init(this);
    }

    /**
     * 按钮点击事件
     *
     * @return
     */
    @OnClick({R.id.iv_return, R.id.btn_register_code, R.id.tv_register_region, R.id.btn_register})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.iv_return:                 //返回按钮
                finish();
                break;
            case R.id.btn_register_code:         //获取验证码
                //手机号
                String mobile = etRegisterPhone.getText().toString();
                /**
                 * 1.判断手机号码非空
                 * 2.判断手机号码格式
                 */
                if (mobile.equals(""))
                    ToastUtils.showShort(this, "请填写手机号码！");
                else if (!CheckUtils.isMobile(mobile))
                    ToastUtils.showShort(this, "手机号码格式不正确！");
                else
                    //开始 网络请求
                    initHttpPushVCode(mobile);

                break;
            case R.id.tv_register_region:        //选择区域
                setSelectionArea();
                break;
            case R.id.btn_register:              //注册按钮
                //开始网络请求
                initRegisterHttp();
                break;
        }
    }

    /**
     * 选择区域
     */
    private void setSelectionArea() {
        //添加默认的配置
        CityConfig cityConfig = new CityConfig.Builder()
                .titleTextColor("#808080")      //标题文字颜  色
                .titleBackgroundColor("#E9E9E9")//标题栏背景色
                .confirTextColor("#699aff")     //确认按钮文字颜色
                .confirmText("确认")            //确认按钮文字
                .confirmTextSize(18)            //确认按钮文字大小
                .cancelTextColor("#699aff")     //取消按钮文字颜色
                .cancelText("取消")             //取消按钮文字
                .cancelTextSize(18)             //取消按钮文字大小
                .province("吉林省")             //默认显示的省份
                .city("长春市")                 //默认显示省份下面的城市
                .district("南关区")             //默认显示省市下面的区县数据
                .provinceCyclic(false)          //省份滚轮是否可以循环滚动
                .cityCyclic(false)              //城市滚轮是否可以循环滚动
                .districtCyclic(false)          //区县滚轮是否循环滚动
                .setShowGAT(true)               //是否显示港澳台数据，默认不显示
                .build();
        mPicker.setConfig(cityConfig);

        //监听选择点击事件及返回结果
        mPicker.setOnCityItemClickListener(new OnCityItemClickListener() {
            @Override
            public void onSelected(ProvinceBean province, CityBean city, DistrictBean district) {

                //定义区域变量
                StringBuffer sBuffer = new StringBuffer("");

                //省份
                if (province != null) {
                    sBuffer.append(province + "-");
                }

                //城市
                if (city != null) {
                    sBuffer.append(city + "-");
                }

                //地区
                if (district != null) {
                    sBuffer.append(district);
                }

                //设置 区域
                tvRegisterRegion.setText(sBuffer.toString());
            }

            @Override
            public void onCancel() {
                ToastUtils.showShort(RegisterActivity.this, "已取消");
            }
        });

        //显示
        mPicker.showCityPicker();
    }

    /**
     * 网络请求 获取 短信 验证码
     */
    private void initHttpPushVCode(String mobile) {


        //开启倒计时线程
        mTimeHandler.postDelayed(mTimeRunnable, 1000);
        //设置按钮文字
        btnRegisterCode.setText(mTimeSecond + "s");
        //设置按钮不可以点击
        btnRegisterCode.setEnabled(false);
        //设置 按钮背景 为 灰色
        btnRegisterCode.setBackgroundResource(R.drawable.bg_public_round_gray);


        /**
         * 创建 okHttp3 请求方式
         */
        FormBody.Builder params = new FormBody.Builder();
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(Constant.HTTP_REGISTER_VCODE_URL + mobile)
                .post(params.build())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                /**
                 * 创建一条 message
                 */
                Message msg = Message.obtain();
                msg.what = Constant.HANDLE_REGISTER_CODE_ERROR;
                mTimeHandler.sendMessageDelayed(msg,1000);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                /**
                 * 创建一条 message
                 */
                Message msg = Message.obtain();
                msg.obj = response.body().string();
                msg.what = Constant.HANDLE_REGISTER_CODE;
                mTimeHandler.sendMessageDelayed(msg,1000);

                /**
                 * 获取session的操作，session放在cookie头，且取出后含有“；”，取出后为下面的 s （也就是sessionId）
                 */
                //获取 验证码 请求头
                Headers headers = response.headers();
                //获取 请求下的 cookie
                List<String> cookies = headers.values("Set-Cookie");
                //TODO 根据 cookie 获取 准确的 sessionId
                String sessionId = cookies.get(0).substring(0, cookies.get(0).indexOf(";"));
                //保存 sessionId 到本地
                mACache.put(Constant.CACHE_SESSION_ID, sessionId);
            }
        });

    }


    /**
     * Handler 验证码请求 倒计时
     */
    private Runnable mTimeRunnable = new Runnable() {
        @Override
        public void run() {
            //倒计时 自 - 1
            mTimeSecond--;
            //设置按钮文字
            btnRegisterCode.setText(mTimeSecond < 10 ? "0" + mTimeSecond + "s" : mTimeSecond + "s");
            //TODO 是否到 做后 1s 了
            if (mTimeSecond == 0) {
                //设置按钮文字
                btnRegisterCode.setText("重新获取");
                //设置按钮可以点击
                btnRegisterCode.setEnabled(true);
                //设置 按钮背景 为 彩色
                btnRegisterCode.setBackgroundResource(R.drawable.btn_public_violet);
                //初始化秒数
                mTimeSecond = 60;
            } else {
                mTimeHandler.postDelayed(this, 1000);
            }
        }
    };

    /**
     * 异步加载 验证码
     */
    public Handler mTimeHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                //TODO 加载网络成功进行UI的更新
                case Constant.HANDLE_REGISTER_CODE:
                    /**
                     * 获取 网络 数据
                     */
                    //开始解析 转换为 实体数据
                    State code = new Gson().fromJson(msg.obj.toString(), State.class);
                    //重置获取验证码线程
                    setResetVcodeThread();
                    //弹出提示
                    ToastUtils.showShort(RegisterActivity.this, code.getMsg());
                    break;
                //TODO 加载网络失败
                case Constant.HANDLE_REGISTER_CODE_ERROR:
                    //重置获取验证码线程
                    setResetVcodeThread();
                    //弹出提示
                    ToastUtils.showShort(RegisterActivity.this, "网络连接不稳定，请稍后在试！！！");
                    break;
            }
        }
    };

    /**
     * 重置 获取验证码线程
     */
    private void setResetVcodeThread(){
        //销毁线程
        mTimeHandler.removeCallbacks(mTimeRunnable);
        //设置按钮文字
        btnRegisterCode.setText("获取验证码");
        //设置按钮可以点击
        btnRegisterCode.setEnabled(true);
        //设置 按钮背景 为 彩色
        btnRegisterCode.setBackgroundResource(R.drawable.btn_public_violet);
        //初始化秒数
        mTimeSecond = 60;
    }

    /**
     * 注册
     */
    private void initRegisterHttp() {

        //店铺名称
        String storeName = etRegisterShopName.getText().toString();
        //手机号
        String mobile = etRegisterPhone.getText().toString();
        //验证码
        String vCode = etRegisterCheckCode.getText().toString();
        //密码
        String pwd = etRegisterPwd.getText().toString();
        //确认密码
        String confirmPwd = etRegisterConfirmPwd.getText().toString();
        //所属区域
        String area = tvRegisterRegion.getText().toString();
        //店铺地址
        String address = etRegisterAddress.getText().toString();
        //店铺电话
        String linkTel = etRegisterShopPhone.getText().toString();
        //业务员姓名
        String workName = etRegisterWorkName.getText().toString();
        //业务员电话
        String workPhone = etRegisterWorkPhone.getText().toString();

        /**
         * 1.判断每个字段非空
         * 2.判断手机号码格式
         * 3.判断密码格式格式
         * 4.判断两次密码是否一致
         * 5.判断验证码
         */
        if (storeName.equals("") || mobile.equals("") || vCode.equals("")
                || pwd.equals("") || confirmPwd.equals("") || area.equals("") || address.equals("")
                || linkTel.equals("")) {
            ToastUtils.showShort(this, "请您认真填写，部分内容不许为空！");
        } else if (!CheckUtils.isMobile(mobile)) {
            ToastUtils.showShort(this, "手机号码格式不正确！");
        } else if (!CheckUtils.isPassword(pwd)) {
            ToastUtils.showShort(this, "密码格式不正确！");
        } else if (!pwd.equals(confirmPwd)) {
            ToastUtils.showShort(this, "两次密码输入不一致！");
        } else {
            initShowTimeDialog("正在注册，请稍后....", this);
            //获取 sessionId
            String sessionId = mACache.getAsString(Constant.CACHE_SESSION_ID);
            //开始网络请求
            mApiManager.userRegister(sessionId, storeName, mobile, area, address, linkTel, workName,workPhone, vCode, pwd);
        }
    }

    /**
     * 显示提示dialog
     */
    public void initShowMsgDialog() {
        //提示 dialog
        MaterialDialog mMsgDialog = new MaterialDialog.Builder(this)
                .title("注册成功")
                .content("恭喜您，已注册成功！是否去登录？")
                .negativeText("不了，谢谢")
                .positiveText("登录")
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        finish();
                    }
                }).show();
        // 设置点击屏幕Dialog不消失
        mMsgDialog.setCanceledOnTouchOutside(false);
        //取消Back键监听
        mMsgDialog.setCancelable(false);
    }


    /**
     * 响应 注册请求 出错
     */
    @Subscriber(tag = Constant.BUS_REGISTER_ERROR)
    public void onRegisterError(String strError) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁弹窗
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(RegisterActivity.this, "网络连接不稳定，请重试！");
            }
        }, 1000);
    }

    /**
     * 加载 注册请求 返回结果
     */
    @Subscriber(tag = Constant.BUS_REGISTER)
    public void onRegister(final State state) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁弹窗
                timeDialog.dismiss();
                //返回值判断
                if (state.getState().equals("1"))
                    //注册成功，弹出提示框
                    initShowMsgDialog();
                else
                    ToastUtils.showShort(RegisterActivity.this, state.getMsg());
            }
        }, 1000);
    }
}
